package cn.hchaojie.ssm.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.hchaojie.ssm.domain.Category;
import cn.hchaojie.ssm.exception.ServiceException;
import cn.hchaojie.ssm.mapper.CategoryMapper;

/**
 * service职责：开始事务，提交事务，调用mapper做数据库查询
 * 处理业务逻辑，
 * @author hchaojie
 *
 */
@Service
@Transactional   
// 相当于在当前类的每个方法上加上了切面，
// 方法执行之前，会开始事务，执行完后，会提交事务，关闭session
public class CategoryService {
	@Autowired
	CategoryMapper mapper;
	
	/**
	 * 增强foo方法，方法执行之前插入一些代码
	 * 
	 * 方法执行之后，加入另外的一些代码
	 */
	public void foo() {
		System.out.println("foo");
	}

	public List<Category> findAll() {
		List<Category> data = mapper.findAll();
		
		return data;
	}
	
	public void insert(Category category) {
		// 开始事务
		mapper.insert(category);
		
		// 提交事务
		// 关闭session
	}
	
	public void update(Category category) {
		mapper.update(category);
	}
	
	// 演示事务的作用
	// 同时修改两个分类
	public void update2(int id1, int id2) {
		Category c1 = mapper.findById(id1);
		Category c2 = mapper.findById(id2);
		
		c1.setName("spring c1");
		c2.setName("spring c2");
		
		mapper.update(c1);	// 中间出异常的话，如果当前方法在一个事务里面，那么事务会回滚
		
		if (true) {
			throw new RuntimeException("service执行出错了！");
		}
		
		mapper.update(c2);
	}
	
	public void delete(int id) {
		try {
			
			mapper.delete(id);
		} catch (DataIntegrityViolationException e) {
			// 把异常做一个业务层的转换，把数据库层的错误转换成业务错误，
			throw new ServiceException(20001, "分类已经关联了文章，不能删除！");
		}
	}
}
